//
//  UserAccountViewModel.swift
//  weibo
//
//  Created by Qing on 2017/5/30.
//  Copyright © 2017年 成哥哥. All rights reserved.
//

import Foundation

class UserAccountViewModel {
    
    
    /// 用户信息模型
    var account: UserAccount?

    /// 判断token是否有效期，如果token过期，则返回nil
    var accountToken: String? {
        
        if !isExpired {
            
//            print("token有效期:\(account?.access_token)")
            return (account?.access_token)!
            
        }
        
        return nil
    }
    
    /// 用户登录标志。true 为有效， false 为失效。
    var userLogon: Bool {
        
//        1.如果token有值，和日期没有失效，则为真。 任一条件不满足，则为假.
        return account?.access_token != nil && !isExpired
    }
    
    
    var avatarUrl: URL {
        
        return URL(string: (account?.avatar_large)!)!
    }

    /// 单例，解决频繁 从沙盒解档的问题。  并且从内存访问token速度较快。
    static let sharedUserAccount: UserAccountViewModel = UserAccountViewModel()
    
    /// 解归的路径 计算型属性。
    private var path: String{
    
        let path = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last
        
        return "\(path!)/account.plist"
        
    }
    
    /// 判断帐户是否否过期
    private var isExpired: Bool {


        /*
        用来调试
//        account?.expiresDate = Date(timeIntervalSinceNow: -3600)
//        print("解档的路径:\(path)")
//        print("系统拿到的时间\(account?.expiresDate)")
//        print(account?.screen_name)
        */
        
        //过期时间跟当前时间对比，如果是降序，则说明未过期。
        if account?.expiresDate?.compare(Date()) == ComparisonResult.orderedDescending{
            
            return false
        }
        
        //如果没有过期，则返回true
        return true
        
    }
    
    /// 构造函数
    private init() {
        
        //解档获取用户信息
        account = NSKeyedUnarchiver.unarchiveObject(withFile: path) as? UserAccount

        //        用来调试下方的逻辑。
        //        account?.expiresDate = Date(timeIntervalSinceNow: -3600)
        //判断token是否过期，如果过期，则清空沙盒保存的account信息
        if isExpired {
//            print("access_token已经过期,保存信息清空")
            account = nil
        }
    }
    
}

//MARK: - 用户帐户相关的网络方法
extension UserAccountViewModel {

     /// 根据code请求用户信息
     ///
     /// - Parameters:
     ///   - code: code
     ///   - finished: 请求是否成功，调用者知道是否成功即可。
     func loadUserAccount(code: String, finished:@escaping (_ isSuccess: Bool) -> () ) {
        
        NetworkTool.sharedTool.LoadAccessToKen(code: code) { (result, error) in
            
            //如果错误不为空，则没有返回值。
            if error != nil {
                print("加载授权码失败")
                print(error)
                finished(false)
                return
            }
            
            //数据 转 模型
            self.account = UserAccount.init(dict: result as! [String: Any])
            
            self.loadUserInFo(account: self.account!, finished: finished)
            
        }
    
    }
    
    /// 请求帐户信息
    ///
    /// - Parameters:
    ///   - account: account: 发起请求的参数，使用UserAccount类的属性，在调用时传入即可。
    ///   - finished: 请求是否成功，调用者知道是否成功即可。
    fileprivate func loadUserInFo(account: UserAccount, finished: @escaping (_ isSuccess: Bool) -> () ) {
        
        NetworkTool.sharedTool.loadUserInFo(uid: account.uid!) { (result, error) in
            
            if error != nil {
                //
                print("请求'用户'信息出错")
                print(error)
                finished(false)
                return
                
            }
            
            guard let dict = result as? [String: Any] else {
                print("请求数据 转 字典 失败")
                return
            }
            
            //保存用户的名字和头像图片
            account.screen_name = dict["screen_name"] as? String
            account.avatar_large = dict["avatar_large"] as? String
            
            account.saveUserAccount()
            finished(true)
            /*以下代码用来调试请求结果用： 判断result是否有值，并是否转换数组成功
             //输出结果能够看到 具体值。
             guard let user = result as? [String: Any] else {
             print("result转换字典失败")
             return
             }
             
             print(user["screen_name"])
             print(user["avatar_large"])
             */
        }
        
    }
    

    
}
